/**
 * 
 * gislin
 * 2016年7月2日
 */
package io.chance.receiverlei.db.redis;

import io.chance.receiverlei.datapacket.DataType;
import io.chance.receiverlei.db.DbManager;
import io.chance.receiverlei.db.RedisDbExecute;
import io.chance.receiverlei.db.StationStatus;
import lrq.common.MyLog;
import lrq.data.DataTable;
import org.apache.log4j.Logger;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;

/**
 * 工控机系统状态redis服务类
 * @author gislin
 * 2016年7月2日
 */
public class StationService {

	private static StationService _instance;
	
	@SuppressWarnings("unused")
	private static Logger log;
	
	private StationService(){
		
	}
	
	public static StationService getInstance(){
		if(_instance == null){
			_instance = new StationService();
			log = MyLog.getLogger("stationRedis");
		}
		return _instance;
	}
	
	/**
	 * 设置站房系统运行状态
	 * gislin
	 * 2016年7月2日
	 * @param mn
	 * @param statusName
	 * @param value
	 */
	public void setSysStatus(String mn,String statusName,String value){
		RedisDbExecute.setString("stationInfo:"+mn+":sysStatus:"+statusName, value);
	}
	
	/**
	 * 设置质控配置信息
	 * gislin
	 * 2016年7月2日
	 * @param mn
	 * @param configName
	 * @param value
	 */
	public void setQualityConfig(String mn,String configName,String value){
		RedisDbExecute.setString("stationInfo:"+mn+":qualityConfig:"+configName, value);
	}
	
	/**
	 * 检查天的请求编号是否已经处理，防止重复处理
	 * gislin
	 * 2016年7月2日
	 * @param mn
	 * @param qn
	 * @return
	 */
	public boolean isDayQNReceive(DataType dataType, String mn, String qn){
		
		String type = "";
		
		if(dataType==DataType.day){
			type = "Day";
		}
		else if(dataType==DataType.hour){
			type = "Hour";
		}
		
		String value = RedisDbExecute.getString(type+":"+qn+":"+mn);
		if("1".equals(value)){
			return true;
		}
		else{
			return false;
		}
	}
	
	/**
	 * 设置天的请求编号已处理
	 * gislin
	 * 2016年7月2日
	 * @param mn
	 * @param qn
	 */
	public void setDayQNReceived(DataType dataType,String mn,String qn){
		String type = "";
		
		if(dataType==DataType.day){
			type = "Day";
		}
		else if(dataType==DataType.hour){
			type = "Hour";
		}
//		RedisDbExecute.setString(type+":"+qn+":"+mn, "1",300);
	}
	
	/**
	 * 获取设备的某个信息
	 * gislin
	 * 2016年7月2日
	 * @param mn
	 * @param deviceInfoKey
	 * @return
	 */
	public String getDeviceInfoValue(String mn,String deviceInfoKey){
		String value = RedisDbExecute.getString("stationInfo:"+mn+":deviceInfo:"+deviceInfoKey);
		return value;
	}
	
	/**
	 * 设置设备的某个信息
	 * gislin
	 * 2016年7月2日
	 * @param mn
	 * @param deviceInfoKey
	 * @param value
	 */
	public void setDeviceInfoValue(String mn,String deviceInfoKey,String value){
		RedisDbExecute.setString("stationInfo:"+mn+":deviceInfo:"+deviceInfoKey, value);
	}
	
	/**
	 * 设置站点状态
	 * gislin
	 * 2016年7月2日
	 * @param status
	 * @param mn
	 */
	public void setStationStatus(StationStatus status, String mn){
		RedisDbExecute.setString("stationInfo:"+mn+":stationStatus",status.getCode());
	}
	
	/**
	 * 把所有点的状态重置为下线
	 * gislin
	 * 2016年7月5日
	 */
	public void setAllStationOffline(){
		Set<String> keys = RedisDbExecute.queryKeys("stationInfo:*:stationStatus");
		for(String key : keys){
			RedisDbExecute.setString(key, StationStatus.fault.getCode());
		}
	}
	
	/**
	 * 更新站点数据接收时间，用于判断是否在线是否活动用
	 * gislin
	 * 2016年7月2日
	 * @param mn
	 */
	public void updateStationDataReceiveTime(String mn){
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		RedisDbExecute.setString("stationInfo:"+mn+":deviceInfo:DataTime_s", sf.format(new Date()));
	}
	
	/**
	 * 获取污染物的报警下限阀值
	 * gislin
	 * 2016年5月13日
	 * @return
	 * @throws Exception 
	 */
	public Double getPollAlarmDown(String mn,String pollCode) throws Exception{
		String hasKey = RedisDbExecute.getString("sysDict:stationPollAlarm:hasKey");
		
		if(hasKey == null || hasKey.trim().equals("")){
			initStationPollAlarm();
		}
		Double down = RedisDbExecute.getDouble("sysDict:stationPollAlarm:"+mn+":"+pollCode+":down");
		
		if(down == null){
			down = RedisDbExecute.getDouble("sysDict:stationPollAlarm:default:"+pollCode+":down");
		}
		return down;
	}
	
	
	
	/**
	 * 获取污染物的报警上限阀值
	 * gislin
	 * 2016年5月13日
	 * @return
	 * @throws Exception 
	 */
	public Double getPollAlarmUp(String mn,String pollCode) throws Exception{
		String hasKey = RedisDbExecute.getString("sysDict:stationPollAlarm:hasKey");
		
		if(hasKey == null || hasKey.trim().equals("")){
			initStationPollAlarm();
		}
		Double up = RedisDbExecute.getDouble("sysDict:stationPollAlarm:"+mn+":"+pollCode+":up");
		
		if(up == null){
			up = RedisDbExecute.getDouble("sysDict:stationPollAlarm:default:"+pollCode+":up");
		}
		return up;
	}
	
	/**
	 * 初始化站点污染物报警阀值信息
	 * gislin
	 * 2016年5月13日
	 * @throws Exception 
	 */
	private void initStationPollAlarm() throws Exception{
//		String sql = "select sp.name pollcode,sp.density_alarm_dowmlimit down,sp.density_alarm_uplimit up,dc.device_num mn from site_pollutants sp\n" +
//						"       left join monitor_station ms on sp.site_id = ms.code\n" +
//						"       left join data_collection_instrumet dc on dc.site_id = ms.code";
		String sql = "select sp.poll_code pollcode,sp.LIMIT_DOWN down,sp.LIMIT_UP up,ms.SITE_ID from D_BC_SITE_POLL sp\n" +
						"       left join D_BC_SITE ms on sp.site_id = ms.ID\n" ;

		DataTable table = DbManager.getDbExecuter().executeQuery(sql, null);
		
		for(int i=0;i<table.getRecordCount();i++){
			String pollCode = table.getString(i, "POLLCODE");
			String down = table.getString(i, "DOWN");
			String up = table.getString(i, "UP");
			String mn = table.getString(i, "SITE_ID");
			
			if("".equals(down) || "".equals(up)){
				continue;
			}
			
			RedisDbExecute.setString("sysDict:stationPollAlarm:"+mn+":"+pollCode+":down",down);
			RedisDbExecute.setString("sysDict:stationPollAlarm:"+mn+":"+pollCode+":up",up);
			RedisDbExecute.setString("sysDict:stationPollAlarm:default:"+pollCode+":up",up);
			RedisDbExecute.setString("sysDict:stationPollAlarm:default:"+pollCode+":down",down);
		}
		
		RedisDbExecute.setString("sysDict:stationPollAlarm:hasKey","1");
	}
}
